home *** CD-ROM | disk | FTP | other *** search
/ START Magazine / START VOL 4 NO 5.st / ATTACK.ARC / ATTACK.GFA (.txt) < prev    next >
Encoding:
GFA-BASIC Atari  |  1989-09-12  |  23.0 KB  |  926 lines

  1. ' ###########################################################################
  2. ' ###################                                       #################
  3. ' ###################              ATTACK!!!                #################
  4. ' ###################          BY RON SCHAEFER              #################
  5. ' ###################   COPYRIGHT 1989 ANTIC PUBLISHING     #################
  6. ' ###################                                       #################
  7. ' ###########################################################################
  8. DEFMOUSE 0
  9. DEFINT "n"        !any variable that begins with n is an integer
  10. DEFTEXT 1,0,0,4
  11. ON BREAK GOSUB clean_up
  12. noe%=12                    ! NOE = Number Of Enemy
  13. ' ------- DIMINSION ARRAYS -------
  14. DIM spalette%(16,3),posx%(4),l$(4),s$(3),e$(20),mex%(noe%),mey%(noe%),espeed%(noe%)
  15. DIM screen%(32255/4),fact%(noe%),fx%(noe%),fy%(noe%),fire!(noe%),finc%(noe%),b$(3)
  16. DIM e_hit!(noe%),blast%(noe%),e!(noe%),type_e%(noe%),e_visable!(noe%),h$(2)
  17. DIM efact%(noe%,10),efx%(noe%,10),efy%(noe%,10),efire!(noe%,10),efinc%(noe%,10)
  18. DIM num_e_rockets%(15),ne_s_max%(15),ne_ch_max%(15),ne_ud_max%(15) ! 15/3=6 types of enemy
  19. DIM scores%(10),array_names$(10),index%(10)
  20. '
  21. path$=DIR$(0)+"\"                         !set path for graphics
  22. rez%=XBIOS(4)
  23. ACLIP 1,0,0,319,199
  24. IF rez%<>0 THEN
  25.   ALERT 3,"|Sorry this program runs in|low resolution only.",1," OK ",junk#
  26.   EDIT
  27. ENDIF
  28. '
  29. IF NOT EXIST(path$+"ATAK_TIT.PI1")
  30.   ALERT 3,"| The file ATAK_TIT.PI1 must | be in the same directory | as ATTACK.PRG.",1,"Abort",d#
  31.   EDIT
  32. ENDIF
  33. IF NOT EXIST(path$+"ATTACK1.PI1")
  34.   ALERT 3,"| The file ATTACK1.PI1 must | be in the same directory | as ATTACK.PRG.",1,"Abort",d#
  35.   EDIT
  36. ENDIF
  37. IF NOT EXIST(path$+"ATTACK2.PI1")
  38.   ALERT 3,"| The file ATTACK2.PI1 must | be in the same directory | as ATTACK.PRG.",1,"Abort",d#
  39.   EDIT
  40. ENDIF
  41. '
  42. @save_pal              !save original palette
  43. FOR i#=0 TO 15
  44.   SETCOLOR i#,0,0,0
  45. NEXT i#
  46. '
  47. @deg_load(path$+"ATTACK1.PI1",0)
  48. @cutpics1
  49. '
  50. @deg_load(path$+"ATTACK2.PI1",0)
  51. @cutpics2
  52. '
  53. CLS
  54. @deg_load(path$+"ATAK_TIT.PI1",-1)       !load title picture
  55. GET 185,3,298,99,moon$
  56. '
  57. @initvar            !initiate variables
  58. ~INP(2)
  59. CLS
  60. a%=XBIOS(3)         !set up parameters for screen swapping
  61. b%=(VARPTR(screen%(0))+255) AND &HFFFF00
  62. TEXT 1,6,"SCORE:"
  63. TEXT 64,6,"SHIELDS:"
  64. TEXT 149,6,"FUEL:"
  65. TEXT 197,6,"ENEMY:"
  66. TEXT 248,6,"HYPERKILL:"
  67. SGET h$
  68. VSYNC
  69. ' ====================== MAIN PROGRAM LOOP ==============================
  70. DO
  71.   key$=INKEY$
  72.   INC tmr%
  73.   IF key$<>""                        !check for keyboard input
  74.     IF key$="q" OR key$="Q"          !quit game
  75.       clean_up
  76.       EDIT
  77.     ELSE IF key$="p" OR key$="P"     !pause game
  78.       TEXT 130,100,"PAUSING"
  79.       TEXT 100,109,"ANY KEY TO CONTINUE"
  80.       landscape
  81.       @score
  82.       PUT mx%,my%,s$(ts%),7          ! Your Ship
  83.       @enemy
  84.       SWAP a%,b%
  85.       VOID XBIOS(5,L:a%,L:b%,-1)
  86.       SPUT h$
  87.       VOID INP(2)
  88.     ELSE IF key$=" "                !Hyperkill
  89.       hyperkill
  90.     ENDIF
  91.   ENDIF
  92.   @landscape
  93.   @turnship
  94.   @joystick
  95.   @enemy
  96.   @enemy_fire
  97.   @firerockets
  98.   @collision
  99.   @incomming
  100.   @bumper
  101.   @ground
  102.   @score
  103.   PUT mx%,my%,s$(ts%),7          ! Your Ship
  104.   IF EVEN(tmr%)
  105.     @cycle_colors
  106.     IF the_enemy%<=0 AND shields%>0
  107.       @new_wave
  108.     ELSE IF shields%<=0
  109.       @game_over
  110.     ENDIF
  111.   ENDIF
  112.   SWAP a%,b%
  113.   VOID XBIOS(5,L:a%,L:b%,-1)
  114.   VSYNC
  115.   SPUT h$
  116.   IF new_wave!
  117.     new_wave!=FALSE
  118.     ds1(4,3)
  119.     PAUSE 5
  120.     ds1(4,4)
  121.     PAUSE 5
  122.     ds1(4,5)
  123.     WAVE 0,0
  124.     PAUSE 30
  125.   ENDIF
  126. LOOP
  127. @clean_up
  128. ' =========================== END OF MAIN PROGRAM ========================
  129. ' By modifying these variables you can significantly change the difficulty
  130. ' of the game play.  If you have a mega with a bliter you will need to either
  131. ' turn the blitter off or else slow down the enemy.
  132. PROCEDURE initvar
  133.   STICK 1
  134.   shields%=15                 ! Initial shield strength for your ship
  135.   hyper%=5                    ! Hyper distruct kills
  136.   num_enemy%=1                 ! Number of enemy (6 types)
  137.   max_speed%=20               ! Your max speed
  138.   num_rockets%=5               ! Number of rockets
  139.   ' -------------------- SHIP TYPE 1-3  DART ---------------------------
  140.   num_e_rockets%(0)=2           ! Number of enemy rockets
  141.   ne_s_max%(0)=10               ! Enemy max speed horizontal
  142.   ne_ch_max%(0)=1               ! Max change in horizontal speed
  143.   ne_ud_max%(0)=1               ! Enemy max speed up or down
  144.   ' -------------------- SHIP TYPE 4-6  JET   --------------
  145.   num_e_rockets%(3)=5           ! Number of enemy rockets
  146.   ne_s_max%(3)=21               ! Enemy max speed horizontal
  147.   ne_ch_max%(3)=1               ! Max change in horizontal speed
  148.   ne_ud_max%(3)=1               ! Enemy max speed up or down
  149.   ' -------------------- SHIP TYPE 7-9  MOSQUITO  --------------
  150.   num_e_rockets%(6)=5           ! Number of enemy rockets
  151.   ne_s_max%(6)=12               ! Enemy max speed horizontal
  152.   ne_ch_max%(6)=2               ! Max change in horizontal speed
  153.   ne_ud_max%(6)=2               ! Enemy max speed up or down
  154.   ' -------------------- SHIP TYPE 10-12  FORK   --------------
  155.   num_e_rockets%(9)=5           ! Number of enemy rockets
  156.   ne_s_max%(9)=18               ! Enemy max speed horizontal
  157.   ne_ch_max%(9)=2               ! Max change in horizontal speed
  158.   ne_ud_max%(9)=2               ! Enemy max speed up or down
  159.   ' -------------------- SHIP TYPE 13-15  BUS   --------------
  160.   num_e_rockets%(12)=6           ! Number of enemy rockets
  161.   ne_s_max%(12)=10               ! Enemy max speed horizontal
  162.   ne_ch_max%(12)=2               ! Max change in horizontal speed
  163.   ne_ud_max%(12)=2               ! Enemy max speed up or down
  164.   ' -------------------- SHIP TYPE 16-18  SAUSER  --------------
  165.   num_e_rockets%(15)=5           ! Number of enemy rockets
  166.   ne_s_max%(15)=5                ! Enemy max speed horizontal
  167.   ne_ch_max%(15)=4               ! Max change in horizontal speed
  168.   ne_ud_max%(15)=8               ! Enemy max speed up or down
  169.   ' ----------------------------------
  170.   e_up_down%=1   !     Percent time enemy will move up or down correctly
  171.   ' --------------------- REFERENCE NUMBERS ---------------------------
  172.   max_shields%=shields%
  173.   max_hyper%=hyper%
  174.   the_enemy%=num_enemy%
  175.   orig_max_speed%=max_speed%
  176.   ' ------------------------------------------------------------
  177.   bump%=9                   ! Bumb between ships zone
  178.   hitx1%=4                  ! Hit zone for enemy ships
  179.   hity1%=0
  180.   hitx2%=28                  ! Hit zone for enemy ships
  181.   hity2%=11
  182.   thresh%=10           ! Threshold for enemy to fire in Y coordinate system
  183.   mx%=145              ! Position of your ship
  184.   my%=100
  185.   shields$=STR$(shields%)
  186.   score%=0
  187.   wave%=1
  188.   type%=0
  189.   nexte%=0
  190.   speed%=0
  191.   posx%(1)=0
  192.   posx%(2)=320
  193.   posx%(3)=640
  194.   posx%(4)=960
  195.   moonx%=185
  196.   small_moonx%=750
  197.   saturnx%=-310
  198.   ts%=1                  ! turing status of your ship right=1 center=2 left=3
  199.   yright!=TRUE           ! your ship starts off facing right
  200.   yr%=1                  ! 1=right and -1=left
  201.   ARRAYFILL fire!(),FALSE
  202.   ARRAYFILL fact%(),0
  203.   ARRAYFILL efire!(),FALSE
  204.   ARRAYFILL efact%(),0
  205.   nexte%=0
  206.   @initenemy
  207. RETURN
  208. ' ------------------ Init enemy positions ----------------------------
  209. PROCEDURE initenemy
  210.   FOR n%=1 TO num_enemy%
  211.     e!(n%)=TRUE
  212.     DO
  213.       mex%(n%)=RANDOM(940)-320               ! Initial x position of emeny
  214.       EXIT IF mex%(n%)<0 OR mex%(n%)>320
  215.     LOOP
  216.     mey%(n%)=RANDOM(140)                   ! Initial y position of emeny
  217.     espeed%(n%)=RANDOM(10)-5               ! Initial speed of enemy
  218.   NEXT n%
  219. RETURN
  220. ' ---------------------------- CYCLE COLORS ----------------------------
  221. PROCEDURE cycle_colors          !for flame and electrical effects
  222.   INC cycle%
  223.   SELECT cycle%
  224.   CASE 1
  225.     VSETCOLOR 11,7,0,0
  226.     VSETCOLOR 14,0,0,0
  227.   CASE 2
  228.     VSETCOLOR 11,0,0,0
  229.     VSETCOLOR 14,7,0,0
  230.   CASE 3
  231.     cycle%=0
  232.   ENDSELECT
  233. RETURN
  234. ' ------------------------ HYPERKILL ------------------------------------
  235. PROCEDURE hyperkill           !kills all enemy on the screen
  236.   IF hyper%>0
  237.     DEC hyper%
  238.     hyperk!=TRUE
  239.     explode1
  240.     FOR n%=1 TO num_enemy%
  241.       IF e_visable!(n%) AND e!(n%)
  242.         e!(n%)=FALSE
  243.         e_hit!(n%)=TRUE
  244.         ADD score%,10
  245.         DEC the_enemy%
  246.       ENDIF
  247.     NEXT n%
  248.   ENDIF
  249.   IF INKEY$=" "
  250.     WHILE INKEY$=" "
  251.     WEND
  252.   ENDIF
  253. RETURN
  254. ' ----DETECT COLLISION WITH GROUND OR ENERGIZE SHIELDS AND INCREASE FUEL ----
  255. PROCEDURE ground
  256.   IF my%>145
  257.     COLOR 1
  258.     IF yright!
  259.       test1%=POINT(ADD(mx%,12),ADD(my%,12))
  260.       test2%=POINT(ADD(mx%,14),ADD(my%,12))
  261.     ELSE
  262.       test1%=POINT(ADD(mx%,20),ADD(my%,12))
  263.       test2%=POINT(ADD(mx%,22),ADD(my%,12))
  264.     ENDIF
  265.     IF test1%<>0 OR test2%<>0
  266.       IF test1%=1 OR test1%=2 OR test1%=3 OR test1%=6 OR test2%=1 OR test2%=2 OR test2%=3 OR test2%=6
  267.         IF shields%>0
  268.           DEC shields%                 !hit ground
  269.           explode2
  270.           ELLIPSE ADD(mx%,17),ADD(my%,7),20,10
  271.         ENDIF
  272.       ELSE IF (test1%=5 OR test2%=5) AND shields%<max_shields%
  273.         INC s_inc%
  274.         IF MOD(s_inc%,1)=0
  275.           ds1(4,4)
  276.           INC shields%                !recharge shields
  277.         ENDIF
  278.       ELSE IF (test1%=11 OR test1%=14 OR test2%=11 OR test2%=14) AND max_speed%<orig_max_speed%
  279.         INC sp_inc%
  280.         IF MOD(sp_inc%,1)=0
  281.           ds1(2,3)
  282.           INC max_speed%             !refuel ship
  283.         ENDIF
  284.       ENDIF
  285.     ENDIF
  286.   ENDIF
  287. RETURN
  288. ' --------------- ENEMY FIRES AT YOU IF YOU ARE IN RANGE -------------------
  289. PROCEDURE enemy_fire
  290.   FOR ne%=1 TO num_enemy%
  291.     IF e!(ne%)
  292.       IF mex%(ne%)>mx%-160 AND mex%(ne%)<mx% AND mey%(ne%)<ADD(my%,thresh%) AND mey%(ne%)>ADD(my%,-thresh%) AND espeed%(ne%)<-2
  293.         eright%=30
  294.         sight!=TRUE
  295.         er%=1
  296.       ELSE IF mex%(ne%)<mx%+160 AND mex%(ne%)>mx% AND mey%(ne%)<ADD(my%,thresh%) AND mey%(ne%)>ADD(my%,-thresh%) AND espeed%(ne%)>2
  297.         sight!=TRUE
  298.         eright%=0
  299.         er%=-1
  300.       ENDIF
  301.       ' -----------------------------------------------------------------------
  302.       IF sight!
  303.         sight!=FALSE
  304.         FOR n%=1 TO num_e_rockets%(type_e%(ne%))
  305.           IF efire!(ne%,n%)=FALSE AND et!=FALSE
  306.             et!=TRUE
  307.             efire!(ne%,n%)=TRUE
  308.             efx%(ne%,n%)=ADD(mex%(ne%),eright%)
  309.             efy%(ne%,n%)=ADD(mey%(ne%),8)
  310.             efinc%(ne%,n%)=MUL(15,er%)
  311.           ENDIF
  312.         NEXT n%
  313.       ENDIF
  314.     ENDIF
  315.     et!=FALSE
  316.     COLOR 1
  317.     FOR n%=1 TO num_e_rockets%(type_e%(ne%))
  318.       IF efire!(ne%,n%)
  319.         efxs%=ADD(efx%(ne%,n%),efact%(ne%,n%))
  320.         IF efxs%>0 AND efy%(ne%,n%)>0 AND efxs%<319 AND efy%(ne%,n%)<199
  321.           PSET efxs%,efy%(ne%,n%),15
  322.           ADD efact%(ne%,n%),efinc%(ne%,n%)
  323.           IF ADD(efact%(ne%,n%),efx%(ne%,n%))>310 OR ADD(efact%(ne%,n%),efx%(ne%,n%))<0
  324.             efire!(ne%,n%)=FALSE
  325.             efact%(ne%,n%)=0
  326.           ENDIF
  327.         ENDIF            ! endif for pset
  328.       ENDIF
  329.     NEXT n%
  330.   NEXT ne%
  331. RETURN
  332. ' ----------------------------- GAME OVER -------------------------------
  333. PROCEDURE game_over
  334.   explode2
  335.   FOR nt%=1 TO 3
  336.     @score
  337.     landscape
  338.     PUT mx%,my%,b$(nt%),7
  339.     PUT mx%-12,my%+15,b$(nt%-1),7
  340.     PUT mx%+15,my%-12,b$(nt%),7
  341.     PUT mx%+15,my%+12,b$(nt%-1),7
  342.     PUT mx%-12,my%-17,b$(nt%),7
  343.     SWAP a%,b%
  344.     VOID XBIOS(5,L:a%,L:b%,-1)
  345.     SPUT h$
  346.   NEXT nt%
  347.   FOR nt%=1 TO 3
  348.     @score
  349.     landscape
  350.     PUT mx%-5,my%,b$(nt%),7
  351.     PUT mx%+12,my%+15,b$(nt%-1),7
  352.     PUT mx%-15,my%-12,b$(nt%),7
  353.     PUT mx%-15,my%+12,b$(nt%-1),7
  354.     PUT mx%+12,my%-17,b$(nt%),7
  355.     SWAP a%,b%
  356.     VOID XBIOS(5,L:a%,L:b%,-1)
  357.     SPUT h$
  358.   NEXT nt%
  359.   GRAPHMODE 2
  360.   FOR zz%=1 TO 12
  361.     @landscape
  362.     @score
  363.     ds1(5,zz%/2)
  364.     DEFTEXT 5,0,0,zz%
  365.     TEXT 95,100,0,"GAME OVER"
  366.     DEFTEXT 4,0,0,zz%
  367.     TEXT 94,99,0,"GAME OVER"
  368.     DEFTEXT 1,0,0,4
  369.     SWAP a%,b%
  370.     VOID XBIOS(5,L:a%,L:b%,-1)
  371.     SGET endgame$
  372.     SPUT h$
  373.   NEXT zz%
  374.   a%=MAX(a%,b%)
  375.   VOID XBIOS(5,L:a%,L:a%,-1)
  376.   SPUT endgame$
  377.   COLOR 1
  378.   PAUSE 25
  379.   @high_score(score%)
  380.   BOX 9,135,69,150
  381.   BOX 7,133,72,152
  382.   BOX 245,135,305,150
  383.   BOX 243,133,307,152
  384.   DEFTEXT 1,0,0,6
  385.   TEXT 21,145,"AGAIN"
  386.   TEXT 260,145,"QUIT"
  387.   GRAPHMODE 3
  388.   pick%=0
  389.   SHOWM
  390.   STICK 1
  391.   DO
  392.     MOUSE x#,y#,k#
  393.     IF x#>7 AND y#>133 AND x#<72 AND y#<152 AND k#=1
  394.       ds2(5,5)
  395.       PBOX 7,133,73,150
  396.       PAUSE 10
  397.       @initvar
  398.       pick%=1
  399.       HIDEM
  400.       CLS
  401.       a%=XBIOS(3)
  402.       b%=(VARPTR(screen%(0))+255) AND &HFFFF00
  403.     ENDIF
  404.     IF x#>245 AND y#>135 AND x#<305 AND y#<150 AND k#=1
  405.       ds2(5,5)
  406.       PBOX 245,135,305,150
  407.       PAUSE 10
  408.       @clean_up
  409.       pick%=2
  410.     ENDIF
  411.     EXIT IF pick%<>0
  412.   LOOP
  413.   GRAPHMODE 1
  414.   DEFTEXT 1,0,0,4
  415. RETURN
  416. ' --------------------------------- HIGH SCORE ----------------------------
  417. PROCEDURE high_score(hi_score%)
  418.   IF EXIST(path$+"HISCORES.DAT")
  419.     OPEN "I",#2,path$+"HISCORES.DAT"
  420.     FOR n%=1 TO 10
  421.       index%(n%)=n%
  422.       INPUT #2;scores%(n%),array_names$(n%)
  423.     NEXT n%
  424.     PRINT
  425.     CLOSE #2
  426.     IF hi_score%>scores%(1)
  427.       scores%(1)=hi_score%
  428.       PRINT AT(5,3);"CONGRATULATIONS NEW HIGH SCORE"
  429.       PRINT AT(5,4);"ENTER YOUR NAME: ____________";
  430.       PRINT AT(22,4);
  431.       INPUT "",name$
  432.       array_names$(1)=name$
  433.       QSORT scores%(),11,index%()
  434.       OPEN "O",#2,path$+"HISCORES.DAT"
  435.       FOR n%=1 TO 10
  436.         PRINT #2,scores%(n%);",";array_names$(index%(n%))
  437.       NEXT n%
  438.       CLOSE #2
  439.       @print_score
  440.     ELSE
  441.       @print_score
  442.     ENDIF
  443.   ELSE
  444.     OPEN "O",#2,path$+"HISCORES.DAT"
  445.     PRINT AT(5,3);"CONGRATULATIONS NEW HIGH SCORE"
  446.     PRINT AT(5,4);"ENTER YOUR NAME: ____________";
  447.     PRINT AT(22,4);
  448.     INPUT "",name$
  449.     FOR n%=1 TO 9
  450.       PRINT #2,"0,............"
  451.     NEXT n%
  452.     PRINT #2,hi_score%;",";name$
  453.     CLOSE #2
  454.     @print_score
  455.   ENDIF
  456. RETURN
  457. ' -----------------------------------------------------------------
  458. PROCEDURE print_score
  459.   OPEN "I",#2,path$+"HISCORES.DAT"
  460.   FOR n%=1 TO 10
  461.     INPUT #2,scores%(n%),array_names$(n%)
  462.   NEXT n%
  463.   CLOSE #2
  464.   DEFFILL 0,2,8
  465.   PBOX 80,36,234,142
  466.   BOX 80,36,234,142
  467.   BOX 78,34,236,144
  468.   PRINT AT(12,6);"   HIGH SCORES"
  469.   FOR n%=10 TO 1 STEP -1
  470.     PRINT AT(12,8+10-n%);scores%(n%);"   ";LEFT$(array_names$(n%),12)
  471.   NEXT n%
  472. RETURN
  473. ' ---------------------------- NEW WAVE OF ENEMY --------------------
  474. PROCEDURE new_wave
  475.   FOR nw%=1 TO 2
  476.     collision
  477.     landscape
  478.     score
  479.     PUT mx%,my%,s$(ts%),7
  480.     SWAP a%,b%
  481.     VOID XBIOS(5,L:a%,L:b%,-1)
  482.     SPUT h$
  483.   NEXT nw%
  484.   collision
  485.   landscape
  486.   score
  487.   PUT mx%,my%,s$(ts%),7
  488.   IF EVEN(new_test%)
  489.     INC num_enemy%
  490.   ENDIF
  491.   INC new_test%
  492.   INC wave%
  493.   IF num_enemy%>12
  494.     num_enemy%=12
  495.   ENDIF
  496.   initenemy
  497.   the_enemy%=num_enemy%
  498.   FOR n%=1 TO 12
  499.     IF RND<0.5 THEN
  500.       type%=nexte%+RANDOM(3)*3
  501.     ELSE
  502.       type%=nexte%
  503.     ENDIF
  504.     IF type%>16
  505.       type%=0
  506.     ENDIF
  507.     type_e%(n%)=type%
  508.   NEXT n%
  509.   ADD nexte%,3
  510.   IF nexte%>16
  511.     nexte%=0
  512.   ENDIF
  513.   ARRAYFILL e_hit!(),FALSE
  514.   ARRAYFILL fire!(),FALSE
  515.   ARRAYFILL fact%(),0
  516.   ARRAYFILL efire!(),FALSE
  517.   ARRAYFILL efact%(),0
  518.   TEXT 130,100,"NEW WAVE!"
  519.   new_wave!=TRUE
  520. RETURN
  521. ' ------------------------------------- SCORE ----------------------------
  522. PROCEDURE score
  523.   TEXT 39,6,STR$(score%)
  524.   TEXT 113,6,STR$(shields%)+"/"+shields$
  525.   TEXT 180,6,STR$(max_speed%)
  526.   TEXT 234,6,STR$(the_enemy%)
  527.   TEXT 310,6,STR$(hyper%)
  528. RETURN
  529. ' --------------------- BUMPER, DETECT MID AIR COLLISIONS ----------------------
  530. PROCEDURE bumper
  531.   FOR n%=1 TO num_enemy%
  532.     IF e!(n%) AND e_visable!(n%)
  533.       '     Box Mex%(N)+1,Mey%(N)+1,Mex%(N)-1,Mey%(N)-1   !can see zone of collision
  534.       '     Box Mx%+Bump%,My%+Bump%,Mx%-Bump%,My%-Bump%
  535.       IF mex%(n%)<ADD(mx%,bump%) AND mey%(n%)<ADD(my%,bump%) AND mex%(n%)>ADD(mx%,-bump%) AND mey%(n%)>ADD(my%,-bump%)
  536.         e_hit!(n%)=TRUE
  537.         e!(n%)=FALSE
  538.         COLOR 3
  539.         ELLIPSE ADD(mx%,17),ADD(my%,7),20,10
  540.         explode2
  541.         DEC the_enemy%
  542.         IF shields%>=2
  543.           SUB shields%,2
  544.         ELSE
  545.           shields%=0
  546.         ENDIF
  547.       ENDIF
  548.     ENDIF
  549.   NEXT n%
  550. RETURN
  551. ' -----------ENEMY, MOVE THE EMENY TOWARDS YOU ----------------------
  552. PROCEDURE enemy
  553.   FOR n%=1 TO num_enemy%
  554.     IF e!(n%)
  555.       e_visable!(n%)=FALSE
  556.       IF mx%>mex%(n%)
  557.         SUB espeed%(n%),ne_ch_max%(type_e%(n%))
  558.         IF espeed%(n%)<-ne_s_max%(type_e%(n%))
  559.           espeed%(n%)=-ne_s_max%(type_e%(n%))        ! Their max speed
  560.         ENDIF
  561.       ELSE
  562.         ADD espeed%(n%),ne_ch_max%(type_e%(n%))
  563.         IF espeed%(n%)>ne_s_max%(type_e%(n%))
  564.           espeed%(n%)=ne_s_max%(type_e%(n%))          ! Their max speed
  565.         ENDIF
  566.       ENDIF
  567.       SUB mex%(n%),ADD(espeed%(n%),speed%)
  568.       IF mex%(n%)<-320
  569.         ADD mex%(n%),960
  570.       ELSE IF mex%(n%)>640
  571.         ADD mex%(n%),-960
  572.       ENDIF
  573.       IF mex%(n%)>-30 AND mex%(n%)<320         ! Are the enemy on the screen
  574.         e_visable!(n%)=TRUE                    ! The enemy are visible
  575.         '  If Rnd(1)<E_up_down%              ! How fast they can move up/down
  576.         IF my%<mey%(n%)
  577.           SUB mey%(n%),ne_ud_max%(type_e%(n%))
  578.         ELSE IF my%>mey%(n%)
  579.           ADD mey%(n%),ne_ud_max%(type_e%(n%))
  580.         ENDIF
  581.         '  Endif
  582.         IF espeed%(n%)<=-2
  583.           PUT mex%(n%),mey%(n%),e$(ADD(1,type_e%(n%))),7
  584.         ELSE IF espeed%(n%)>=-1 AND espeed%(n%)<=1
  585.           PUT mex%(n%),mey%(n%),e$(ADD(2,type_e%(n%))),7
  586.         ELSE IF espeed%(n%)>=2
  587.           PUT mex%(n%),mey%(n%),e$(ADD(3,type_e%(n%))),7
  588.         ENDIF
  589.       ENDIF
  590.     ENDIF
  591.   NEXT n%
  592. RETURN
  593. ' ------------------------------ SCROLL THE Landscape -------------------------
  594. PROCEDURE landscape
  595.   FOR n%=1 TO 4                  ! Do landscape
  596.     SUB posx%(n%),speed%
  597.     IF posx%(n%)<-320
  598.       ADD posx%(n%),1280
  599.     ELSE IF posx%(n%)>640
  600.       ADD posx%(n%),-1280
  601.     ENDIF
  602.   NEXT n%
  603.   FOR n%=1 TO 4
  604.     IF posx%(n%)>-319 AND posx%(n%)<319
  605.       PUT posx%(n%),158,l$(n%),7
  606.     ENDIF
  607.   NEXT n%
  608.   ' ----------------
  609.   SUB moonx%,(speed%*0.5)              ! Is the moon on the screen
  610.   IF moonx%<-320
  611.     ADD moonx%,1280
  612.   ELSE IF moonx%>640
  613.     ADD moonx%,-1280
  614.   ENDIF
  615.   IF moonx%>-110 AND moonx%<320
  616.     PUT moonx%,10,moon$,7
  617.   ENDIF
  618.   ' ----------------
  619.   SUB small_moonx%,(speed%*0.5)       ! Is the small moon on the screen
  620.   IF small_moonx%<-320
  621.     ADD small_moonx%,1280
  622.   ELSE IF small_moonx%>640
  623.     ADD small_moonx%,-1280
  624.   ENDIF
  625.   IF small_moonx%>-70 AND small_moonx%<320
  626.     PUT small_moonx%,70,small_moon$,7
  627.   ENDIF
  628.   ' ----------------
  629.   SUB saturnx%,(speed%*0.5)              ! Is the saturn on the screen
  630.   IF saturnx%<-320
  631.     ADD saturnx%,1280
  632.   ELSE IF saturnx%>640
  633.     ADD saturnx%,-1280
  634.   ENDIF
  635.   IF saturnx%>-190 AND saturnx%<320
  636.     PUT saturnx%,20,saturn$,7
  637.   ENDIF
  638. RETURN
  639. ' -------------------------------- Joystick ------------------------
  640. PROCEDURE joystick
  641.   stk%=STICK(1)                        ! Read joystick
  642.   IF stk%=1 OR stk%=9 OR stk%=5
  643.     SUB my%,4
  644.     IF my%<8
  645.       my%=8
  646.     ENDIF
  647.   ENDIF
  648.   IF stk%=2 OR stk%=6 OR stk%=10
  649.     ADD my%,4
  650.     IF my%>180
  651.       my%=180
  652.     ENDIF
  653.   ENDIF
  654.   IF stk%=4 OR stk%=5 OR stk%=6
  655.     IF yright!
  656.       turnship!=TRUE
  657.       ts%=2
  658.     ELSE
  659.       @adjustspeed
  660.     ENDIF
  661.   ENDIF
  662.   IF stk%=8 OR stk%=9 OR stk%=10
  663.     IF yright!
  664.       @adjustspeed
  665.     ELSE
  666.       turnship!=TRUE
  667.       ts%=2
  668.     ENDIF
  669.   ENDIF
  670. RETURN
  671. ' ------------------------------ TURN SHIP ---------------------------
  672. PROCEDURE turnship
  673.   IF turnship!=TRUE
  674.     IF yright!
  675.       ts%=3
  676.       yr%=-1
  677.       yright!=FALSE
  678.     ELSE
  679.       yright!=TRUE
  680.       yr%=1
  681.       ts%=1
  682.     ENDIF
  683.     turnship!=FALSE
  684.   ENDIF
  685. RETURN
  686. ' ---------------------------- ADJUST SPEED ------------------------------
  687. PROCEDURE adjustspeed
  688.   INC dec_max_speed%
  689.   IF MOD(dec_max_speed%,40)=0
  690.     IF max_speed%>2
  691.       DEC max_speed%
  692.     ENDIF
  693.   ENDIF
  694.   IF yright!
  695.     INC speed%
  696.     IF speed%>max_speed%
  697.       speed%=max_speed%
  698.     ENDIF
  699.   ELSE
  700.     DEC speed%
  701.     IF speed%<-max_speed%
  702.       speed%=-max_speed%
  703.     ENDIF
  704.   ENDIF
  705. RETURN
  706. ' ----------- FIRE YOUR ROCKETS AT THE ENEMY ---------------------------
  707. PROCEDURE firerockets
  708.   IF STRIG(1)
  709.     FOR n%=1 TO num_rockets%
  710.       IF fire!(n%)=FALSE AND t!=FALSE THEN
  711.         t!=TRUE
  712.         fire!(n%)=TRUE
  713.         IF yright!
  714.           fx%(n%)=ADD(mx%,30)
  715.         ELSE
  716.           fx%(n%)=ADD(mx%,0)
  717.         ENDIF
  718.         fy%(n%)=ADD(my%,11)
  719.         finc%(n%)=MUL(15,yr%)
  720.       ENDIF
  721.     NEXT n%
  722.   ENDIF
  723.   t!=FALSE
  724.   '  Defline 1,0,0,1
  725.   COLOR 1
  726.   FOR n%=1 TO num_rockets%
  727.     IF fire!(n%)
  728.       fxs%=ADD(fx%(n%),fact%(n%))
  729.       '     Line Fxs%,Fy%(N%),Add(Fxs%,5),Fy%(N%)
  730.       IF fxs%>0 AND fy%(n%)>0 AND ADD(fxs%,5)<319 AND fy%(n%)<199
  731.         ALINE fxs%,fy%(n%),ADD(fxs%,5),fy%(n%),1,&HFFFF,2
  732.         ADD fact%(n%),finc%(n%)
  733.         IF ADD(fact%(n%),fx%(n%))>310 OR ADD(fact%(n%),fx%(n%))<0
  734.           fire!(n%)=FALSE
  735.           fact%(n%)=0
  736.         ENDIF
  737.       ENDIF          ! for aline test
  738.     ENDIF
  739.   NEXT n%
  740. RETURN
  741. ' ---------- INCOMING, SEE IF THE ENEMY HAS HIT YOU --------------------
  742. PROCEDURE incomming
  743.   FOR ne%=1 TO num_enemy%
  744.     FOR nn%=1 TO num_e_rockets%(type_e%(ne%))
  745.       efxs%=SUB(ADD(efx%(ne%,nn%),efact%(ne%,nn%)),efinc%(ne%,nn%))
  746.       IF efire!(ne%,nn%)
  747.         '        Box Add(Mx%,Hitx1%),Add(My%,Hity1%),Add(Mx%,Hitx2%),Add(My%,Hity2%)
  748.         '       Box Efxs%+2,Efy%(Ne%,Nn%)+2,Efxs%-2,Efy%(Ne%,Nn%)-2
  749.         IF efxs%>ADD(mx%,hitx1%) AND efy%(ne%,nn%)>ADD(my%,hity1%) AND efxs%<ADD(mx%,hitx2%) AND efy%(ne%,nn%)<ADD(my%,hity2%)
  750.           IF shields%>0
  751.             @explode2
  752.             COLOR 3
  753.             ELLIPSE ADD(mx%,17),ADD(my%,7),20,10
  754.             DEC shields%
  755.             efire!(ne%,nn%)=FALSE
  756.             efact%(ne%,nn%)=FALSE
  757.           ENDIF
  758.         ENDIF
  759.       ENDIF
  760.     NEXT nn%
  761.   NEXT ne%
  762. RETURN
  763. ' -----------------COLLISION, SEE IF YOU HAVE HIT THE ENEMY ---------------
  764. PROCEDURE collision
  765.   FOR nn%=1 TO num_rockets%
  766.     fxs%=SUB(ADD(fx%(nn%),fact%(nn%)),finc%(nn%))
  767.     IF fire!(nn%)
  768.       FOR n%=1 TO num_enemy%
  769.         '        Box Add(Mex%(N%),Hitx1%),Add(Mey%(N%),Hity1%),Add(Mex%(N%),Hitx2%),Add(Mey%(N%),Hity2%)
  770.         '       Box Fxs%+2,Fy%(Nn%)+2,Fxs%-2,Fy%(Nn%)-2
  771.         IF fxs%>ADD(mex%(n%),hitx1%) AND fy%(nn%)>ADD(mey%(n%),hity1%) AND fxs%<ADD(mex%(n%),hitx2%) AND fy%(nn%)<ADD(mey%(n%),hity2%) AND e!(n%) AND e_visable!(n%)
  772.           @explode1
  773.           e!(n%)=FALSE
  774.           ADD score%,10
  775.           DEC the_enemy%
  776.           fire!(nn%)=FALSE
  777.           fact%(nn%)=FALSE
  778.           e_hit!(n%)=TRUE
  779.         ENDIF
  780.       NEXT n%
  781.     ENDIF
  782.   NEXT nn%
  783.   FOR n%=1 TO num_enemy%
  784.     IF e_visable!(n%)
  785.       IF e_hit!(n%)
  786.         INC blast%(n%)
  787.         PUT mex%(n%),mey%(n%),b$(blast%(n%)),7
  788.         IF blast%(n%)>2 THEN
  789.           blast%(n%)=0
  790.           e_hit!(n%)=FALSE
  791.           IF hyperk!
  792.             hyperk!=FALSE
  793.           ENDIF
  794.         ENDIF
  795.         IF hyperk!
  796.           INC hsk%
  797.           IF hsk%=3 THEN
  798.             hsk%=1
  799.           ENDIF
  800.           PUT ADD(mx%,-15),ADD(my%,-15),h$(hsk%),7
  801.         ENDIF
  802.       ENDIF
  803.     ENDIF
  804.   NEXT n%
  805. RETURN
  806. ' --------------------------- GET PICTURE PIECES --------------------------
  807. ' DEGAS PICTURES CAN BE LOADED IN AND PORTIONS CUT OUT WITH THE GET COMMAND
  808. PROCEDURE cutpics1
  809.   GET 0,56,319,98,l$(1)             ! Landscape 1
  810.   GET 0,99,319,141,l$(2)            ! Landscape 2
  811.   GET 0,142,319,184,l$(3)           ! Landscape 3
  812.   '
  813.   GET 0,0,33,12,s$(1)               ! Your space ship facing right
  814.   GET 0,16,33,28,s$(3)              ! Your space ship facing left
  815.   GET 0,30,33,39,s$(2)              ! Your space ship facing center
  816.   '
  817.   GET 37,0,67,18,e$(1)                ! Enemy facing right
  818.   GET 37,19,67,36,e$(3)                ! Enemy facing left
  819.   GET 37,38,67,50,e$(2)                ! Enemy facing center
  820.   '
  821.   GET 70,0,105,12,e$(4)                ! Enemy facing right
  822.   GET 70,14,105,26,e$(6)                ! Enemy facing left
  823.   GET 70,29,105,38,e$(5)                ! Enemy facing center
  824.   '
  825.   GET 106,0,142,12,e$(7)                ! Enemy facing right
  826.   GET 106,14,142,26,e$(9)                ! Enemy facing left
  827.   GET 106,29,142,38,e$(8)                ! Enemy facing center
  828.   '
  829.   GET 144,0,182,12,e$(10)                ! Enemy facing right
  830.   GET 144,15,182,26,e$(12)                ! Enemy facing left
  831.   GET 144,32,182,46,e$(11)                ! Enemy facing center
  832.   '
  833.   GET 186,0,223,12,e$(13)                ! Enemy facing right
  834.   GET 186,13,223,24,e$(15)                ! Enemy facing left
  835.   GET 186,26,223,38,e$(14)                ! Enemy facing center
  836.   '
  837.   GET 225,0,262,12,e$(16)                ! Enemy facing right
  838.   GET 225,14,262,24,e$(18)                ! Enemy facing left
  839.   GET 225,27,261,38,e$(17)                ! Enemy facing center
  840.   '
  841.   GET 268,0,299,23,b$(2)
  842.   GET 257,23,279,43,b$(1)
  843.   GET 286,25,319,52,b$(3)
  844. RETURN
  845. ' --------------------------- GET PICTURE PIECES --------------------------
  846. PROCEDURE cutpics2
  847.   GET 34,0,102,41,h$(1)             ! hyperkill 1
  848.   GET 105,0,177,41,h$(2)            ! hyperkill 2
  849.   GET 175,0,244,58,small_moon$
  850.   GET 125,58,319,139,saturn$
  851.   GET 0,157,319,199,l$(4)
  852. RETURN
  853. ' -------------------------- CLEAN UP AT END -----------------------------
  854. PROCEDURE clean_up
  855.   STICK (0)
  856.   SHOWM
  857.   a%=MAX(a%,b%)
  858.   VOID XBIOS(5,L:a%,L:a%,-1)
  859.   SPUT h$
  860.   @restorepal
  861.   ERASE spalette%()
  862.   EDIT
  863. RETURN
  864. ' ---------------------- SAVE ORIGINAL COLOR PALETTE -----------------------
  865. PROCEDURE save_pal
  866.   FOR z%=0 TO 15
  867.     DPOKE CONTRL,26
  868.     DPOKE CONTRL+2,0
  869.     DPOKE CONTRL+6,2
  870.     DPOKE INTIN,z%
  871.     DPOKE INTIN+2,0
  872.     VDISYS
  873.     spalette%(z%,0)=DPEEK(INTOUT+2)
  874.     spalette%(z%,1)=DPEEK(INTOUT+4)
  875.     spalette%(z%,2)=DPEEK(INTOUT+6)
  876.   NEXT z%
  877. RETURN
  878. ' ---------------------------- RESTORES PALETTE -----------------------------
  879. PROCEDURE restorepal
  880.   FOR z%=0 TO 15
  881.     DPOKE CONTRL,14
  882.     DPOKE CONTRL+2,0
  883.     DPOKE CONTRL+6,4
  884.     DPOKE INTIN,z%
  885.     DPOKE INTIN+2,spalette%(z%,0)
  886.     DPOKE INTIN+4,spalette%(z%,1)
  887.     DPOKE INTIN+6,spalette%(z%,2)
  888.     VDISYS
  889.   NEXT z%
  890. RETURN
  891. ' ------------------------------ DO SOUNDS ----------------------------
  892. PROCEDURE explode1
  893.   SOUND 1,8,4095
  894.   WAVE 7689,1,9,5851
  895. RETURN
  896. PROCEDURE explode2
  897.   SOUND 1,8,4095
  898.   WAVE 7689,1,9,52851
  899. RETURN
  900. PROCEDURE ds1(snd%,snd1%)
  901.   SOUND 1,12,snd%,snd1%
  902.   WAVE 1,1,9,6000
  903. RETURN
  904. PROCEDURE ds2(snd%,snd1%)
  905.   SOUND 1,12,snd%,snd1%
  906.   WAVE 1,1,8,512,5
  907.   WAVE 0,0
  908. RETURN
  909. '
  910. PROCEDURE deg_load(filename$,pal!)        ! Loads an uncompressed DEGAS picture
  911.   LOCAL n%,x#,y#,z#,c#
  912.   OPEN "I",#1,filename$
  913.   SEEK #1,2                          ! Move to first DEGAS color byte.
  914.   FOR n%=0 TO 15                      ! (First 2 bytes are DEGAS resolution info)
  915.     x#=INP(#1)
  916.     y#=INP(#1)
  917.     z#=x#*256+y#
  918.     IF pal!
  919.       c#=XBIOS(7,n%,z#)
  920.     ENDIF
  921.   NEXT n%
  922.   BLOAD filename$,XBIOS(2)-34
  923.   CLOSE #1
  924. RETURN
  925. '
  926.